/* 
 * File:   UsersDB.h
 * Author: nahuel
 *
 * Created on June 4, 2013, 8:34 PM
 */

#ifndef USERSDB_H
#define	USERSDB_H

#include <string>
#include "common_tinyxml.h"
/**
 * @class UsersDB
 * Clase para manipular la base de datos de Usuarios de la Aplicación AU
 */
class UsersDB {
    private:
        static const std::string _rootNodeName;
        static const std::string _userNodeName;
        static const std::string _usernameAttrName;
        static const std::string _hashedPswAttrName;
        
        std::string _filePath;
        TiXmlDocument* _dbFile;
        
        /**
         * @brief Crea el archivo de la base de datos de usuarios. 
         *  Se utiliza cuando no se encuentra el archivo solicitado.
         */
        void _CrearArchivo();
        
    public:
        /**
         * @brief Constructor que Inicializa la base de datos de usuarios  
         * representada por filePath.
         * Si no existe, se inicializa una nueva vacia.
         * @param filePath path de la base de datos de usuario
         */
        UsersDB(const std::string& filePath);
        
        /**
         * @brief Agrega un nuevo usuario a la base de datos guardando el hash
         * de su contraseña.
         * @param usuario Nombre de usuario
         * @param password Password de usuario
         * @return true si el usuario se agregó corretamente, false si el
         * usuario no se agregó por ya existir previamente.
         */
        bool AgregarUsuario(const std::string& usuario, const std::string& password);
        
        /**
         * @brief Chequea la existencia de un determinado usuario
         * @param usuario Nombre de usuario.
         * @return Devuelve true si existe algun usuario en la base de datos 
         * con ese username
         */
        bool ExisteUsuario(const std::string& usuario);
        
        /**
         * @brief Autentica a un usuario existente en la Base de Datos
         * @param usuario Nombre de usuario
         * @param password Password de usuario
         * @return Devuelve true si el usuario y contraseña corresponden a un 
         * usuario de la base de datos. False en caso contrario
         */
        bool AutenticarUsuario(const std::string& usuario, const std::string& password);
        
        /**
         * @brief Elimina un usuario de la base de datos.
         * @param usuario Nombre de usuario
         * @return Devuelve true en caso exitoso, false si no es exitoso
         */
        bool DeleteUsuario(const std::string& usuario);
        
        /**
         * @brief Cambia la password del usuario. 
         * @return Devuelve true si el usuario existe y se puedo cambiar la 
         * password. False en caso contrario.
         * 
         */
        bool CambiarPassword(const std::string& usuario, const std::string& nuevaPsw);
        
        /**
         * @brief Destructor que libera los recursos utilizados.
         */
        virtual ~UsersDB();
};

#endif	/* USERSDB_H */

